package com.singfan.common.util;

import java.util.Date;

/**
 * 用户登录Token工具类
 * Author: HanSongHe
 * Date: 2015-07-27 15:43
 * Desc: token形式为：userId-Signature-loginStamp，其中Signature为userId的签名，长度为8，loginStamp为最后登陆的时间戳，长度为8。
 */
public class TokenUtil {
    /**
     * 创建token，如果userId、key或loginTime为空，则返回null
     * @param userId 用户id
     * @param key 用户特定混淆key
     * @param loginTime 登录时间
     * @return 用户的token
     */
    public static String createToken(String userId, String key, Date loginTime){
        String token = null;
        if (!StringUtil.isNullOrEmpty(userId) && !StringUtil.isNullOrEmpty(key) && loginTime != null){
            String sing = createSignature(userId, key);
            String loginStamp = createLoginStamp(loginTime);
            token = userId + "-" + sing + "-" + loginStamp;
        }

        return token;
    }

    /**
     * 校验token格式是否正确
     * @param token token
     * @param key 用户特定混淆key
     * @return true:正确  false:不正确
     */
    public static boolean checkSignature(String token, String key){
        boolean result = false;

        if(!StringUtil.isNullOrEmpty(token) && !StringUtil.isNullOrEmpty(key)){
            String[] arr = token.split("-");
            if(arr.length == 3){
                String id = arr[0];
                String sign = arr[1];
                String signature = createSignature(id, key);
                if(signature != null && signature.equals(sign)){
                    result = true;
                }
            }
        }

        return result;
    }

    /**
     * 获取UserId，token为空则返回null
     * @param token 用户的token
     * @return UserId
     */
    public static String getUserId(String token){
        String userId = null;
        if(!StringUtil.isNullOrEmpty(token)){
            String[] arr = token.split("-");
            if(arr.length == 3 && CheckUtil.isPositiveInteger(arr[0])){
                userId = arr[0];
            }
        }
        return userId;
    }

    /**
     * 校验最后登录的时间戳是否正确
     * @param token token
     * @param loginTime 最后登录时间
     * @return true:正确  false:不正确
     */
    public static boolean checkLoginStamp(String token, Date loginTime){
        String tokenStamp = "";
        if(!StringUtil.isNullOrEmpty(token)){
            String[] arr = token.split("-");
            if(arr.length == 3){
                tokenStamp = arr[2];
            }
        }
        String loginStamp = createLoginStamp(loginTime);
        return loginStamp.equals(tokenStamp);
    }

    private static String createSignature(String userId, String salt){
        String result = null;
        if(!StringUtil.isNullOrEmpty(userId) && !StringUtil.isNullOrEmpty(salt)){
            String md5 = EncryptionUtil.md5(userId + "-" + salt);
            if(!StringUtil.isNullOrEmpty(md5)){
                result = md5.substring(0,8);
            }
        }

        return result;
    }

    private static String createLoginStamp(Date loginTime){
        return String.valueOf(loginTime.getTime()).substring(7);
    }
}
